package com.zch.starter.metrics.prometheus.springboot.starter.instance.actuator;

import com.sun.management.OperatingSystemMXBean;
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.system.DiskSpaceHealthIndicator;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.lang.management.ManagementFactory;
import java.util.Map;

/**
 * 服务的资源监控： 磁盘 cpu 内存信息
 */
public class ServerResourceMonitor {
    @Resource
    DiskSpaceHealthIndicator diskSpaceHealthIndicator;
    private OperatingSystemMXBean osBean;

    public Health getDiskHealth() {
        return diskSpaceHealthIndicator.health();
    }
    @PostConstruct
    public void init() {
        this.osBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();//不能交给spring 来注入 否则启动不了
    }
    /**
     * 该方法返回的是当前 Java  进程的JVM 堆内存使用率
     * （0.0-1.0）
     * @return
     */
    public double getJavaMemoryUsage() {
        Runtime runtime = Runtime.getRuntime();//获取当前 Java 虚拟机实例的 Runtime 对象。
        long usedMemory = runtime.totalMemory() - runtime.freeMemory();
        long maxMemory = runtime.maxMemory();
        return (double) usedMemory / maxMemory;
    }

    /**
     * 当前java 进程的cpu 使用率
     * （0.0-1.0）
     * @return
     */
    public double getJavaCpuLoad(){
        return osBean.getProcessCpuLoad();
    }

    /**
     整个系统的 CPU 使用情况，包括所有的进程。
     （0.0-1.0）
     * @return
     */
    public double getSystemCpuLoad(){
        return osBean.getSystemCpuLoad();
    }

    /**
     * 该方法返回的是当前整个系统级别的内存使用率
     * （0.0-1.0）
     * @return
     */
    public double getSystemMemoryUsage() {
        // 获取系统总内存
        long totalMemory = osBean.getTotalPhysicalMemorySize();
        // 获取系统空闲内存
        long freeMemory = osBean.getFreePhysicalMemorySize();
        // 计算系统内存使用率
        double systemMemoryUsage = (double) (totalMemory - freeMemory) / totalMemory;
        return systemMemoryUsage;
    }

    /**
     * 获取磁盘使用率
     * （0.0-1.0）
     * @return
     */
    public double getDiskSpaceUsage() {
        Health diskHealth = diskSpaceHealthIndicator.health();

        // 提取磁盘空间的详细信息
        Map<String, Object> details = diskHealth.getDetails();

        // 假设详细信息中包含可用空间和总空间
        long freeSpace = (long) details.get("free");
        long totalSpace = (long) details.get("total");

        // 计算磁盘使用率
        double diskUsage = (double) (totalSpace - freeSpace) / totalSpace;
        return diskUsage;

    }
}
